package cn.tedu.notice.service.impl;

import cn.tedu.notice.mapper.NoticeMapper;
import cn.tedu.notice.mapper.NoticeStaffMapper;
import cn.tedu.notice.feign.EmpClient;
import cn.tedu.notice.pojo.dto.NoticeAddParam;
import cn.tedu.notice.pojo.dto.NoticeQuery;
import cn.tedu.notice.pojo.dto.NoticeUpdateParam;
import cn.tedu.notice.pojo.entity.Notice;
import cn.tedu.notice.pojo.entity.NoticeStaff;
import cn.tedu.notice.pojo.vo.NoticeStaffVO;
import cn.tedu.notice.pojo.vo.NoticeVO;
import cn.tedu.notice.pojo.vo.PageResult;
import cn.tedu.notice.service.NoticeService;
import cn.tedu.response.StatusCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

@Slf4j
@Service
public class NoticeServiceImpl implements NoticeService {

    @Autowired
    private NoticeMapper noticeMapper;

    @Autowired
    private NoticeStaffMapper noticeStaffMapper;

//    @Autowired
//    private EmpClient empClient;

    /**
     * 创建公告
     *
     * @param noticeAddParam
     * @return
     */
    @Override
    public void insertNotice(NoticeAddParam noticeAddParam) {
        log.debug("开始生成公告 mapper入参 noticeAddParam={}", noticeAddParam);
        Notice notice = new Notice();
        BeanUtils.copyProperties(noticeAddParam, notice);
        log.debug("赋值完成：{}", notice);
        notice.setDelFlag("0");  //0-不删除（默认）
        notice.setStatus("1");
        notice.setCreateTime(new Date());
        //插入notice_staff表中，需要notice_id,设计一个返回值，得到新增的noticeId
        int noticeId = noticeMapper.insert(notice);

        //同时往notice_staff表中插入数据
        //一个公告发布给多个员工对象
        //noticeAddParam参数中的公告id为空（数据库中自增)
        //addNoticeStaff(noticeAddParam, noticeAddParam.getEmpListId());
        log.debug("新增公告成功 {}", notice);
        log.debug("返回的公告的id  noticeId={}", noticeId);
        addTo(notice, noticeAddParam.getEmpListId());
    }


    /**
     * 查询所有公告（发布状态status=1,没被删除del_flag=0）
     *
     * @param noticeQuery
     * @return
     */
    @Override
    public List<NoticeVO> selectNotice(NoticeQuery noticeQuery) {
        log.debug("查询公告：noticeQuery={}", noticeQuery);
        List<NoticeVO> noticeList = noticeMapper.select(noticeQuery);
        log.debug("查询结果：noticeList={}", noticeList);
        return noticeList;
    }

    /**
     * 根据公告id，查看公告详情
     * 并展示未读公告的员工的姓名
     *
     * @param noticeId
     * @return
     */
//    @Override
    public NoticeVO selectNoticeById(Integer noticeId) throws Exception {
        log.debug("查看公告详情 公告noticeId:{}", noticeId);
        NoticeQuery noticeQuery = new NoticeQuery();
        noticeQuery.setId(noticeId);
        NoticeVO noticeVO = null;
        try {
            noticeVO = selectNotice(noticeQuery).get(0);
        } catch (Exception e) {
            log.debug("当前公告不存在! " + e.getMessage());
            throw new RuntimeException(StatusCode.DATA_UNEXISTS.getMsg(), e.getCause());
        }
        return noticeVO;
    }

    /**
     * 删除公告
     *
     * @param id
     */
    @Override
    public void deleteNoticeById(Integer id) {
        log.debug("删除公告 id={}", id);
        //(更新)设置公告的状态status=0（禁用）、del_flag=1（逻辑删除）
        Notice notice = new Notice();
        notice.setId(id);
        notice.setStatus("0");
        notice.setDelFlag("1");
        notice.setUpdateTime(new Date());
        noticeMapper.updateNoticeById(notice);
    }

    /**
     * 更新公告
     *
     * @param noticeUpdateParam
     */
    @Override
    public void updateNotice(NoticeUpdateParam noticeUpdateParam) {
        log.debug("更新公告业务 noticeAddParam={} ", noticeUpdateParam);
        Notice notice = new Notice();
        BeanUtils.copyProperties(noticeUpdateParam, notice);
        log.debug("更新公告 赋值得到的notice={}", notice);
        noticeMapper.updateNoticeById(notice);

        //更新同时，也可能对接收的人员更新
        addTo(notice, noticeUpdateParam.getEmpListId());
    }

    /**
     * 更新公告，并保存到草稿箱
     *
     * @param noticeUpdateParam
     */
    @Override
    public void updateToDraftNotice(NoticeUpdateParam noticeUpdateParam) {
        log.debug("更新公告，并保存到草稿箱 noticeUpdateParam={}", noticeUpdateParam);
        Notice notice = new Notice();
        BeanUtils.copyProperties(noticeUpdateParam, notice);
        notice.setStatus("0");
        noticeMapper.updateNoticeById(notice);
        //同时也要保存需要接收的员工的id，向notice_staff表中插入数据
        addTo(noticeUpdateParam, noticeUpdateParam.getEmpListId());
    }

    /**
     * 根据条件查询并分页
     *
     * @param noticeQuery
     * @return
     */
    @Override
    public PageResult<NoticeVO> pageQuery(NoticeQuery noticeQuery) {
        Integer count = noticeMapper.queryCount(noticeQuery);
        log.debug("查询出的总数为：={}", count);
        if (count == null || count < 1) {
            return new PageResult<>();
        }
        List<NoticeVO> noticeVOList = noticeMapper.queryData(noticeQuery);
//        log.debug("查询出的数据noticeVOList={}", noticeVOList);
        return new PageResult<>(count, noticeVOList);
    }

    /**
     * 更新公告的状态  1-启用  0-禁用
     *
     * @param id
     */
    @Override
    public void updateNoticeStatus(Integer id) {
        log.debug("更新公告状态 ={}", id);
        Notice notice = new Notice();
        notice.setId(id);
        notice.setUpdateTime(new Date());
        notice.setStatus("1");
        noticeMapper.updateNoticeStatus(notice);
    }

    /**
     * 新增公告/保存到草稿箱 的同时，保存公告-员工 于都关系到notice_staff表中
     *
     * @param object
     * @param empListId
     */
    @Transactional
    public void addTo(Object object, List<Integer> empListId) {
        log.debug("Object {}, 插入noticeStaff表 员工的id{}",object,empListId);
        NoticeStaff noticeStaff = new NoticeStaff();
        if (object instanceof Notice) {
            //新增公告的同时，向notice_staff中插入数据
            Notice notice = (Notice) object;
            log.debug("新增公告：notice {}",notice);
            for (Integer empListIds : empListId) {
                noticeStaff.setNoticeId(notice.getId());
                noticeStaff.setStaffId(empListIds);
                noticeStaff.setStatus("1");
                noticeStaff.setCreateTime(new Date());
                noticeStaffMapper.insert(noticeStaff);
            }
        } else if (object instanceof NoticeUpdateParam) {
            //新增草稿箱的同时，往notice_staff中插入数据
            NoticeUpdateParam noticeUpdateParam = (NoticeUpdateParam) object;
            log.debug("新增草稿箱：noticeUpdateParam {}",noticeUpdateParam);
            for (Integer empListIds : empListId) {
                noticeStaff.setNoticeId(noticeUpdateParam.getId());
                noticeStaff.setStaffId(empListIds);
                noticeStaff.setStatus("1");
                noticeStaff.setCreateTime(new Date());
                noticeStaffMapper.insert(noticeStaff);
            }
        }
    }
}
